#include <iostream>
#include <mysql/mysql.h>
#include <error.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using std::cout;
using std::endl;

const char *host = "localhost";
const unsigned int port = 8080;
const char *usr = "xq";
const char *passwd = "010416";
const char *db = "test_db";

int main()
{
    // 初始化MySQL对象
    MYSQL *mysql = mysql_init(nullptr);
    if (mysql == nullptr)
    {
        perror("mysql_init error:");
        return 1;
    }

    // 连接MySQL
    if (!mysql_real_connect(mysql, host, usr, passwd, db, port, NULL, 0))
    {
        perror("mysql connect error:");
        return 2;
    }

    // 对数据进行操作
    // insert->insert->delete->select
    // 打印所有行所有列出来

    // 设定编码，防止MySQL编码不一致，MySQL客户端默认拉丁编码
    // mysql_set_character_set(mysql, "utf8");

    // 开始插入
    // const char *query1 = "insert into stu(name) value(\"许钦\")";
    // const char *query2 = "insert into stu(name) value(\"许繁\")";
    // const char *query3 = "update stu set id=1 where name=\"许钦\"";
    // const char *query4 = "update stu set id=2 where name=\"许繁\"";
    // mysql_query(mysql, query1);
    // mysql_query(mysql, query2);
    // mysql_query(mysql, query3);
    // mysql_query(mysql, query4);
    // 查询

    const char *query5 = "select * from stu";
    mysql_query(mysql, query5);

    //把查询的结果保存到MYSQL_RES中
    MYSQL_RES *res = mysql_store_result(mysql);

    my_ulonglong rows = mysql_num_rows(res);     // 查询到的行
    unsigned int fields = mysql_num_fields(res); // 查询到的列
    MYSQL_FIELD *field = mysql_fetch_field(res); // 查询到的列名

    // 输出列名称
    for (int i = 0; i < fields; i++)
        std::cout << field[i].name << "\t";
    std::cout << "\n";

    // 输出列数据
    for (int i = 0; i < rows; i++)
    {
        MYSQL_ROW row = mysql_fetch_row(res);
        for (int j = 0; j < fields; j++)
            std::cout << row[j] << "\t";
        std::cout << "\n";
    }

    std::cout << field[0].db << " " << field[0].table << std::endl;
    mysql_free_result(res);
    mysql_close(mysql);

    // std::string sql;
    // while (true)
    // {
    //     std::cout << "MySQL>>>";
    //     if (!std::getline(std::cin, sql))
    //         break;
    //     if (sql == "quit")
    //         break;
    //     int n = mysql_query(mysql, sql.c_str());
    //     if (n == 0)
    //         std::cout << sql << " success:" << std::endl;
    //     else
    //         std::cerr << sql << " failed: " << n << std::endl;
    // }
    // std::cout << "connect success" << std::endl;
    // mysql_close(mysql);

    return 0;
}
